package com.hsu.yupao.controller;

import com.hsu.yupao.common.BaseResponse;
import com.hsu.yupao.common.ErrorCode;
import com.hsu.yupao.common.ResultUtils;
import com.hsu.yupao.exception.BusinessException;
import com.hsu.yupao.model.domain.User;
import com.hsu.yupao.model.request.ChatRequest;
import com.hsu.yupao.model.vo.MessageVO;
import com.hsu.yupao.service.ChatService;
import com.hsu.yupao.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;

import static com.hsu.yupao.constant.ChatConstant.PRIVATE_CHAT;
import static com.hsu.yupao.constant.ChatConstant.TEAM_CHAT;
import static com.hsu.yupao.constant.ChatConstant.HALL_CHAT;

/**
 * 聊天控制器
 * @ClassName: ChatController
 * @author Hsu琛君珩
 * @date 2024-06-03
 * @apiNote
 * @Version: v1.0
 */
@RestController
@RequestMapping("/chat")
@CrossOrigin(origins = {"http://localhost:5173/"}, allowCredentials = "true")
@Slf4j
public class ChatController {

    @Resource
    private ChatService chatService;

    @Resource
    private UserService userService;

    /**
     * 获取私人聊天记录。
     * 使用 POST 请求来处理可能的新聊天记录创建或状态更新。
     * @param chatRequest 包含目标用户ID和可能的附加信息。
     * @param request 用于从会话中获取当前登录的用户信息。
     * @return 返回私聊历史记录的操作结果。
     */
    @PostMapping("/privateChat")
    public BaseResponse<List<MessageVO>> getPrivateChat(@RequestBody ChatRequest chatRequest, HttpServletRequest request) {
        if (chatRequest == null) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR);
        }
        User loginUser = userService.getLoginUser(request);
        List<MessageVO> privateChat = chatService.getPrivateChat(chatRequest, PRIVATE_CHAT, loginUser);
        return ResultUtils.success(privateChat);
    }

    /**
     * 获取团队聊天记录。
     * 使用 POST 请求因为团队聊天可能涉及新的聊天记录创建和状态更新。
     * @param chatRequest 包含团队ID和可能的聊天信息。
     * @param request 用于从会话中获取当前登录的用户信息。
     * @return 返回团队聊天历史记录的操作结果。
     */
    @PostMapping("/teamChat")
    public BaseResponse<List<MessageVO>> getTeamChat(@RequestBody ChatRequest chatRequest, HttpServletRequest request) {
        if (chatRequest == null) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR);
        }
        User loginUser = userService.getLoginUser(request);
        List<MessageVO> teamChat = chatService.getTeamChat(chatRequest, TEAM_CHAT, loginUser);
        return ResultUtils.success(teamChat);
    }

    /**
     * 获取大厅聊天记录。
     * 使用 GET 请求，因为此操作只涉及读取数据且不更改服务器状态。
     * @param request 用于从会话中获取当前登录的用户信息。
     * @return 返回大厅聊天历史记录的操作结果。
     */
    @GetMapping("/hallChat")
    public BaseResponse<List<MessageVO>> getHallChat(HttpServletRequest request) {
        User loginUser = userService.getLoginUser(request);
        List<MessageVO> hallChat = chatService.getHallChat(HALL_CHAT, loginUser);
        return ResultUtils.success(hallChat);
    }

}
